/*
 * Antonio: Este es la clase asociada al ActionForm "LoginPacientesForm".
 * En ella realizaremos la logica de negocio (mecanismo de validacion complejo)
 * Es importante recordar que esta clase NO DEBE tener atributos
 * (es una clase sin estado)
 */
package infb.actions;

import org.apache.struts.action.*;
import javax.servlet.http.*;
import infb.forms.*;
import infb.dao.*;
import infb.errores.*;
import javax.naming.*;
import infb.modelo.*;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;





public class LoginAction extends Action {
    /*
     * Metodo para la gestion de permisos
     */
public ArrayList<String> permisosSubMenu(String perfil, Object usuario){
    ArrayList<String>menu=new ArrayList();
    if(perfil.equals("paciente")){
        menu.add("<a href=\"VerPaciente.do?id=" + ((Pacientes)usuario).getId() + "\"> Mis Datos</a>");
        menu.add("<a href=VerMedico.do?m=propio> Mi Médico</a>");
        menu.add("<a href=\"BuscarMedicos.do\"> Búsqueda de Médicos</a>");
        menu.add("<a href=\"BuscarMedicamentos.do\"> Búsqueda de Medicamentos</a>");
        menu.add("<a href=ListarCitas.do> Mis Citas</a>");
        menu.add("<a href=PedirCita.do> Pedir Cita</a>");
    }else if(perfil.equals("medico")){
        menu.add("<a href='VerMedico.do?dni=" + ((Medicos)usuario).getDni() + "'> Mis Datos</a>");
        menu.add("<a href=ListarCitas.do> Lista de Citas</a>");
        menu.add("<a href=BuscarMedicos.do> Lista de Médicos</a>");
        menu.add("<a href=BuscarPacientes.do> Mis Pacientes</a>");
        menu.add("<a href=BuscarMedicamentos.do> Lista de Medicamentos</a>");
    }else if(perfil.equals("administrador")){
        menu.add("<a href=NuevosPacientes.do> Introducir Paciente</a>");
        menu.add("<a href=NuevosMedicos.do> Introducir Medico</a>");
        menu.add("<a href=NuevosMedicamentos.do> Introducir Medicamento</a>");
        menu.add("<a href=BuscarPacientes.do> Lista de Pacientes</a>");
        menu.add("<a href=BuscarMedicos.do> Lista de Médicos</a>");
        menu.add("<a href=BuscarMedicamentos.do> Lista de Médicamentos</a>");
    }

    return menu;
}

public TreeMap permisosBotones(String perfil, Object usuario){
    
    TreeMap botones=new TreeMap();
    ArrayList<String>permisos=new ArrayList();

    if(perfil.equals("paciente")){
        permisos.add("<input type='button' id='btn1' value='modificar' onclick=\"javascript:location.href='CargarPacientes.do?id="+ ((Pacientes)usuario).getId() +"'\" />");
        permisos.add("<input type='button' id='btn1' value='eliminar' onclick=\"javascript:eliminarPaciente('"+ ((Pacientes)usuario).getId() +"','"+((Pacientes)usuario).getNombre()+"')\" />");
        permisos.add("<input type='button' id='btn1' value='Historial' onclick=\"javascript:location.href='VerHistorial.do?id="+((Pacientes)usuario).getId()+"'\" />");
        permisos.add("<input type='button' id='btn1' value='Tratamiento' onclick=\"javascript:location.href='VerTratamiento.do'\" />");
        botones.put("misDatosP",permisos);


    }else if(perfil.equals("medico")){

    }else if(perfil.equals("administrador")){

    }
    return botones;
}
    /*
     * Metodo para validar la autenticacion de un paciente en el sistema
     */
    private ActionForward loginPacientes(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException {
        try {
            Context contexto = new InitialContext();
            PacientesInterfaz pacientesInterfaz = (PacientesInterfaz) contexto.lookup("PacientesEJB");
            HttpSession sesion = peticion.getSession();
            Pacientes paciente = null;


            LoginPacientesForm formulario = (LoginPacientesForm) form;
            String tarjetaSanitaria = formulario.getTarjetaSanitaria();
            String password = formulario.getPassword();
            paciente = (Pacientes) pacientesInterfaz.estaAutenticado(tarjetaSanitaria, password);

            if (paciente != null) {

                sesion.setAttribute("usuario", paciente);
                sesion.setAttribute("perfil", "paciente");
                List<String> menu = new ArrayList<String>();
                TreeMap botones=new TreeMap();

                //cargamos el subMenu correspondiente a PACIENTE
                menu=this.permisosSubMenu("paciente", paciente);
                botones =this.permisosBotones("paciente", paciente);
                System.out.print(menu);
                sesion.setAttribute("menu", menu);
                sesion.setAttribute("botonesGlobales", botones);

                return mapping.findForward("login_ok");

            } else {
                // Fijamos los parametros necesarios para el formulario de error
                peticion.setAttribute("claveMensajeError", "formularios.login_pacientes.error.autenticacion_incorrecta");
                peticion.setAttribute("urlRetorno", "index.jsp");
                return mapping.findForward("login_incorrecto");
            }
        } catch (NamingException ne) {
            throw new GestionHospitalariaException("Error: No se pudo cargar la clase DAO PacientesInterfaz " + ne.getMessage());
        }
    }

    /*
     * Metodo para validar la autenticacion de un paciente en el sistema
     */
    private ActionForward loginInterno(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException {
        try {
            Context contexto = new InitialContext();
            MedicosInterfaz medicosInterfaz = (MedicosInterfaz) contexto.lookup("MedicosEJB");
            AdministradoresInterfaz administradoresInterfaz = (AdministradoresInterfaz) contexto.lookup("AdministradoresEJB");
            LoginInternoForm formulario = (LoginInternoForm) form;
            String identificacion = formulario.getIdentificacion();
            String password = formulario.getPassword();

            Medicos medico = (Medicos) medicosInterfaz.estaAutenticado(identificacion, password);
            Administradores administrador = (Administradores) administradoresInterfaz.estaAutenticado(identificacion, password);

            if (medico != null) {
                System.out.println("MEDICO");
                HttpSession sesion = peticion.getSession();
                sesion.setAttribute("usuario", medico);
                sesion.setAttribute("perfil", "medico");

                List<String> menu = new ArrayList<String>();
                //cargamos el subMenu correspondiente a MEDICO
                menu=this.permisosSubMenu("medico", medico);                
                System.out.print(menu);
                sesion.setAttribute("menu", menu);
                return mapping.findForward("login_ok");
            } else if (administrador != null) {
                System.out.println("ADMINISTRADOR");
                HttpSession sesion = peticion.getSession();
                sesion.setAttribute("usuario", administrador);
                sesion.setAttribute("perfil", "administrador");
                List<String> menu = new ArrayList<String>();
                menu=this.permisosSubMenu("administrador", administrador);
                sesion.setAttribute("menu", menu);
                return mapping.findForward("login_ok");
            } else {
                // Fijamos los parametros necesarios para el formulario de error
                peticion.setAttribute("claveMensajeError", "formularios.login_interno.error.autenticacion_incorrecta");
                peticion.setAttribute("urlRetorno", "login.jsp");
                return mapping.findForward("login_incorrecto");
            }
        } catch (NamingException ne) {
            throw new GestionHospitalariaException("Error: No se pudo cargar la clase DAO PacientesInterfaz " + ne.getMessage());
        }
    }

    private ActionForward pacienteLogueado(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException {
        try {
            Context contexto = new InitialContext();
            PacientesInterfaz pacientesInterfaz = (PacientesInterfaz) contexto.lookup("PacientesEJB");
            HttpSession sesion = peticion.getSession();
            Pacientes paciente = (Pacientes) sesion.getAttribute("usuario");


            if (paciente != null) {

                sesion.setAttribute("usuario", paciente);
                sesion.setAttribute("perfil", "paciente");
                List<String> menu = new ArrayList<String>();
                //consulta BBDD
                menu.add("<a href='VerPaciente.do?id=${usuario.id}'> Mis Datos</a>");
                menu.add("<a href='VerPaciente.do?id=" + paciente.getId() + "'> Mis Datos</a>");


                menu.add("Pedir Cita");
                peticion.setAttribute("menu", menu);
                return mapping.findForward("ok");
            } else {

                // Fijamos los parametros necesarios para el formulario de error
                peticion.setAttribute("claveMensajeError", "formularios.login_pacientes.error.autenticacion_incorrecta");
                peticion.setAttribute("urlRetorno", "index.jsp");
                return mapping.findForward("incorrecto");
            }
        } catch (NamingException ne) {
            throw new GestionHospitalariaException("Error: No se pudo cargar la clase DAO PacientesInterfaz " + ne.getMessage());
        }
    }

    /*
     * Metodo para validar la autenticacion de un paciente en el sistema
     */
    private ActionForward logout(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) {

        /* Recuperamos la sesion actual del usuario, la destruimos y,
         * en funcion del perfil almacenado redirigimos a una pagina u
         * otra
         */
        HttpSession sesion=peticion.getSession();
        String perfil=(String)sesion.getAttribute("perfil");
        sesion.invalidate();
        
        // No deberia ocurrir, pero puede que algun usuario malintencionado intente acceder
        // a esta acción sin previamente estar logueado, lo que implicaria que la variable
        // de sesion perfil este a null. El utilizarla para comparar provoca una NullPointerException
        // luego recogemos ese caso excepcional y redirigimos, por ejemplo, hacia el forward de logout
        // para pacientes
        try{
            if(perfil.equalsIgnoreCase("paciente")){
                return mapping.findForward("logout_paciente_ok");
            }else{
                return mapping.findForward("logout_interno_ok");
            }
        }catch(NullPointerException npe){
            return mapping.findForward("logout_paciente_ok");
        }
    }

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException {
        String delegaEn = mapping.getParameter();
        if (delegaEn.equalsIgnoreCase("login_pacientes")) {
            // login de pacientes
            return this.loginPacientes(mapping, form, peticion, respuesta);
        } else if (delegaEn.equalsIgnoreCase("login_interno")) {
            // login interno (administradores y medicos)
            return this.loginInterno(mapping, form, peticion, respuesta);
        } else if (delegaEn.equalsIgnoreCase("paciente_logueado")) {
            // login interno (administradores y medicos)
            return this.pacienteLogueado(mapping, form, peticion, respuesta);
        } else {
            return this.logout(mapping, form, peticion, respuesta);
        }
    }
}
